// import puppeteer from 'puppeteer'; // or import puppeteer from 'puppeteer-core';
const puppeteer = require("puppeteer");

(async function () {
    // Launch the browser and open a new blank page
    const browser = await puppeteer.launch({
        headless: false, // 设置为 true 时会启动无头浏览器
        args: ["--no-sandbox", "--disable-setuid-sandbox"],
    });

    const page = await browser.newPage();

    // 访问网页之前执行脚本
    await page.evaluateOnNewDocument(() => {
        // 删除 window.navigator.webdriver 属性
        delete navigator.__proto__.webdriver;
    });

    await page.setViewport({width: 1080, height: 1024});

    // Navigate the page to a URL.
    await page.goto(
        "https://www.nhc.gov.cn/wjw/c100175/202112/9bd330edb1a34e5b87cb66d4f657074e.shtml"
    );

    // page.on("request", req => {
    //     console.log("req.headers", req.headers())
    //     console.log("req.method", req.method())
    //     console.log("postData", req.postData())
    // })
    // page.on("response", async res => {
    //     console.log("response", res.url())
    // })

    //  常用方法
    // page.waitForNavigation(): 等待页面导航完成。
    // page.waitForSelector(): 等待页面上的特定元素出现。
    // page.waitForTimeout(): 等待指定的时间。
    // page.waitForFunction(): 等待特定的 JavaScript 表达式为 true。

    await page.waitForNavigation(); // 需要等待页面加载完成
    // const a = await page.$(".header_nav ul > li > a"); // 主站首页
    // console.log(a)
    // await a.click();
    // const a = (await page.$$(".header_nav ul > li > a"))[0];
    // console.log(a)
    // await a.click();

    // const data = await page.$eval("div", el => {
    //     console.log("puppeteer 内核浏览器", el);
    //
    //     return "主动返回的结果作为 方法返回值";
    // })
    //
    // console.log("page.$eval 结果：", data);

    // 插入 script, 但是不推荐
    // await page.addScriptTag({
    //     content: "const saveImage = (path) => console.log('调用了 saveImage 方法, path = ', path);"
    // })
    // page.addStyleTag(options)

    // 获取 cookies, 需要符合 网站中的 cookie
    // const cookies = await page.cookies("http://www.nhc.gov.cn/");
    // console.log(cookies);

    const saveImg = (path) => {
        console.log("有人调用 saveImg 方法了", path);
    };

    // await page.waitForSelector("", {visible: true, timeout: 0})

    // 和 eval 一致 只能传递数据, 不能传递方法, 方法函数是不可以直接通过参数传递的形式供内部浏览器使用, 后面我们会介绍另一种形式实现。
    // 需要 await page.waitForNavigation(); 等待页面加载完毕 / 需要 await page.goto(url, { waitUntil: "networkidle2" });
    // waitUntil 其他模式没有尝试
    const evaluate = await page.evaluate((saveImg) => {
        console.log(saveImg);
        return "这是传递的数据";
    }, saveImg);
    console.log(evaluate);

    // // 将 方法进行传递
    // await page.exposeFunction("saveImg", path => {
    //     saveImg(path)
    // });
    // const evaluate = await page.evaluate(() => {
    //     console.log("puppeteer 内核浏览器");
    //     saveImg("/img/test")
    // })


    // 确认属性已删除
    const isWebDriver = await page.evaluate(() => "webdriver" in navigator);
    console.log(`window.navigator.webdriver 存在: ${isWebDriver}`); // 应该输出 false


    //   await browser.close();
})();
